home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / udev / migrate-iftab.pl < prev   
Perl Script  |  2008-10-24  |  3KB  |  96 lines

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6.  
  7. my $IFTAB = "/etc/iftab";
  8. my $RULES = "/etc/udev/rules.d/70-persistent-net.rules";
  9.  
  10.  
  11. #-----------------------------------------------------------------------------#
  12. # Sanity check
  13. #-----------------------------------------------------------------------------#
  14. die "$IFTAB does not exist to convert\n" unless -f $IFTAB;
  15. die "$RULES already exists\n" if -f $RULES;
  16.  
  17.  
  18. #-----------------------------------------------------------------------------#
  19. # Parse /etc/iftab
  20. #-----------------------------------------------------------------------------#
  21.  
  22. open IFTAB, $IFTAB
  23.     or die "Unable to open $IFTAB: $!";
  24. open RULES, ">$RULES"
  25.     or die "Unable to open $RULES: $!";
  26.  
  27. print RULES "# This file maintains persistent names for network interfaces.\n";
  28. print RULES "# See udev(7) for syntax.\n";
  29. print RULES "#\n";
  30. print RULES "# Entries are automatically added by the 75-persistent-net-generator.rules\n";
  31. print RULES "# file; however you are also free to add your own entries.\n\n";
  32.  
  33. my @lines;
  34. while (<IFTAB>) {
  35.     push @lines, $_;
  36.  
  37.     chomp;
  38.     s/^\s*//;
  39.  
  40.     next if /^\#/;
  41.     next unless length;
  42.  
  43.     my ($iface, $selectors) = split /\s/, $_, 2;
  44.     next unless $selectors;
  45.  
  46.     my @rules;
  47.     while ($selectors) {
  48.     my ($selector, $value, $remainder) = split /\s/, $selectors, 3;
  49.     last unless $selector;
  50.     last unless $value;
  51.     $selectors = $remainder;
  52.  
  53.     if ($selector =~ /^SYSFS\{([^\}]*)\}$/) {
  54.         push @rules, "ATTRS{$1}==\"$value\"";
  55.     } elsif ($selector =~ /^driver$/) {
  56.         push @rules, "DRIVERS==\"$value\"";
  57.     } elsif ($selector =~ /^bus$/) {
  58.         push @rules, "SUBSYSTEMS==\"$value\"";
  59.     } elsif ($selector =~ /^businfo$/) {
  60.         push @rules, "ATTR{device}==\"$value\"";
  61.     } elsif ($selector =~ /^(mac|address)$/) {
  62.         push @rules, "ATTRS{address}==\"" . lc($value) . "\"";
  63.     } elsif ($selector =~ /^(arp|linktype)$/) {
  64.         push @rules, "ATTRS{type}==\"$value\"";
  65.     }
  66.     }
  67.  
  68.     next unless @rules;
  69.  
  70.     print RULES "# Converted from $IFTAB on upgrade\n";
  71.     print RULES join(", ", "SUBSYSTEM==\"net\"", "DRIVERS==\"?*\"", @rules,
  72.              "NAME=\"$iface\"") . "\n";
  73.     print RULES "\n";
  74. }
  75.  
  76. close RULES
  77.     or warn "Error while closing $RULES: $!";
  78. close IFTAB
  79.     or warn "Error while closing $IFTAB: $!";
  80.  
  81.  
  82. open IFTAB, ">$IFTAB"
  83.     or die "Unable to open $IFTAB: $!";
  84.  
  85. print IFTAB "# This file is no longer used and has been automatically replaced.\n";
  86. print IFTAB "# See $RULES for more information.\n";
  87. print IFTAB "#\n\n";
  88.  
  89. foreach my $line (@lines) {
  90.     $line =~ s/^(\s*)/$1\#/ if $line !~ /^\s*\#/;
  91.     print IFTAB $line;
  92. }
  93.  
  94. close IFTAB
  95.     or warn "Error while closing $IFTAB: $!";
  96.